using System;
using System.Collections.Generic;
using System.Text;

namespace PW.Mini.SlepowronskiJ.Siec.Aktywacja
{
    /// <summary>
    /// Liniowa funkcja aktywacji
    /// </summary>
    /// <remarks>
    /// <code>
    ///        |1            if x > 1/A
    /// f(x) = |A * x        if 1/A > x > 0
    ///        |0            if 0 > x
    /// 
    ///             A > 0      
    /// </code>
    /// </remarks>
    [Serializable]
    class LiniowaFunkcjaAktywacji :IFunkcjaAktywacji
    {
        /// <summary>
        /// parametr A liniowej funkcji aktywacji
        /// </summary>
        protected double a = 1.0f;

        /// <summary>
        /// pobiera i ustawia wartosc parametru A
        /// ( A musi byc dodatnia - ustawia sie 1 w przypadku niedodatniej wartosci )
        /// </summary>
        public double A
        {
            get { return a; }
            set
            {
                a = (value > 0) ? value : 1.0f;
            }
        }

        public LiniowaFunkcjaAktywacji()
            : base()
        {
            nazwa = "Liniowa";
            rodzajPolarnosci = SKALOWANIE_UNIPOLARNE;
        }

        /// <summary>
        /// Clone the object.
        /// </summary>
        /// <returns>The cloned object.</returns>
        public override object Clone()
        {
            return new LiniowaFunkcjaAktywacji();
        }

        /// <summary>
        ///  pobiera wartosc funkcji aktywacji
        /// </summary>
        /// <param name="x">x</param>
        /// <returns>f(x)</returns>
        public override double WartoscFunkcji(double x)
        {
            if (a * x > 1) return 1.0;
            else if (0 > x) return 0.0;
            else return a * x;
        }

        /// <summary>
        /// pobiera wartosc pochodnej funkcji aktywacji
        /// </summary>
        /// <param name="x">x</param>
        /// <returns>f'(x)</returns>
        public override double WartoscPochodnejFunkcji(double x)
        {
            if (a * x > 1) return 1.0;
            else if (0 > x) return 1.0;
            return a;
        }
    }
}
